#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <conio.h>
#include <windows.h>

// 超市管理系统 - 综合版本
// 集成库存管理、销售管理、会员管理和员工管理

// 常量定义
#define LENGTH  1000 // 超市中所有商品信息数量上限
#define MAX_STAFF_COUNT 1000 // 超市中所有员工信息数量的上限
#define MAX_STOCK_COUNT 1000 // 超市中所有库存信息数量的上限
#define MAX_MEMBER_COUNT 1000 // 超市中所有会员信息数量的上限
#define MAX_SALE_COUNT 1000 // 超市中所有销售信息数量的上限

// 前向声明
int main_stock();
int sale();
int funtion();
int minmain();

//超市管理系统头文件：定义数据的形式及功能
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define LENGTH  1000 //超市中所有商品信息数量上限
#define MAX_STAFF_COUNT 1000 //超市中所有员工信息数量的上限
#define MAX_STOCK_COUNT 1000 //超市中所有库存信息数量的上限
#define MAX_MEMBER_COUNT 1000//超市中所有会员信息数量的上限
#define MAX_SALE_COUNT 1000//超市中所有销售信息数量的上限
//商品：编号、名称、产地，数量、价格
/*
分析：
用什么类型来存单个/种商品的信息      结构体
用什么方式存储超市中商品信息的整体      结构体数组或链式
*/
//定义商品信息结构体
struct goods{
char id[20];       //商品编号
char name[10];     //商品名称
char where[30];    //商品产地
int num;           // 商品数量
double price;      //商品价格
};
int  count = 0;       //记录当前超市中商品的数量
struct goods  good[LENGTH];   //超市中所有商品信息
void input_good();     //商品信息入库函数头部申明
void output_good();    //商品信息浏览函数头部申明
void select_id();      //商品信息查询函数头部申明
void modify_id();      //商品信息修改函数头部申明
void delete_id();      //商品信息删除函数头部申明
int output_file();     //商品文件写入函数头部申明
int intput_file();     //商品信息读取函数头部申明
//定义欢迎界面功能函数
// 分析：由于欢迎界面是提供给用户看，不需要返回值， 而不需要传递参数给函数体实现地功能
//所以该函数无返回类型，用void标识，函数参数为空
void welcome(){
int flag;//记录文件读取时返回值
printf("\n********************\n");
printf("\n欢迎使用超市管理系统\n");
printf("\n按任意键继续\n") ;
printf("\n********************\n");
flag = intput_file();
printf("flag = %d\n",flag);
if(flag == 0){
printf("读取商品文件good_data.bin成功！");
output_good();
}

getch();
}

//定义主操作界面函数
/*分析；
1、显示主操作界面的内容
2、给用户预留输入接口：相当于给用户提供输入
3、根据用户输入的选择值，进入相应的操作
4、让整个系统的功能可以重复完成相应的功能，直到用户输入退出系统对应的选择值
*/
void menu(){
int choice;  //记录用户输入
int flag;    //记录文件写入函数返回值
while(1){
system("cls");
printf("\n欢迎使用超市管理系统\n");
printf("\n1、商品信息入库\n");
printf("\n2、商品信息删除\n");
printf("\n3、商品信息修改\n");
printf("\n4、商品信息查询\n");
printf("\n5、商品信息浏览\n");
printf("\n6、系统颜色设置\n");
printf("\n7、应用程序退出\n");
printf("\n8、保存信息至文件\n");
printf("\n请输入您的选择（1-8）:");
scanf("%d",&choice);
if(choice == 7){
break;
}

switch(choice){
case 1:input_good();
break;
case 2:delete_id();
break;
case 3:modify_id();
break;
case 4:select_id();
break;
case 5:output_good();
break;
case 6:printf("\n系统颜色设置\n");
break;
case 8:flag = output_file();
if (flag == 0){
printf("商品信息写入good_data.bin成功! \n");
}

break;
default:
printf("\n输入值有误，不在1-8！\n");
}

getch()    ;
}

}

//定义商品入库函数
//分析：入库操作 就是给结构体数组good的数组元素赋值。
//入库完一种商品信息后，提供给用户选择是否继续入库操作，当用户输入n或N时，结束入库
void input_good(){
char choice;
while(1){
printf("\n当前实现商品的编号：");
scanf("%s",&good[count].id);
printf("\n当前实现商品的名称：");
scanf("%s",&good[count].name);
printf("\n当前实现商品的产地：");
scanf("%s",&good[count].where);
printf("\n当前实现商品的数量：");
scanf("%d",&good[count].num);
printf("\n当前实现商品的价格：");
scanf("%lf",&good[count].price);
printf("\n商品入库成功！\n");
printf("%s %s %s %d %lf",good[count].id,good[count].name,good[count].where,good[count].num,good[count].price);
count++;
printf("\n入库还继续？(Y/N):");
scanf(" %c",&choice);
if (choice == 'N' || choice == 'n'){
break;
}

}

}

//商品信息浏览函数
//分析：将商品信息结构体数组good中的数组元素一一显示出来
//实现：利用循环依次将结构体数组good中的数组元素显示出来
void  output_good(){
int i;
printf("\n当前系统中已有商品信息：\n");
for(i = 0;i < count;i++){
printf("%s %s %s %d %lf\n",good[i].id,good[i].name,good[i].where,good[i].num,good[i].price);
}

printf("\n按任意键返回！\n");
getch();
}

//商品信息删除函数
//分析：将要删除信息的关键内容与待删除数据集一一进行比较，如果对比完所有数据均没有则给出未找到提示
//如果找到则删除，从找到信息的下一个位置依次覆盖前一个信息直到数据结束
//实现：将要删除商品信息的关键内容与待删除数据集商品结构数组good中的元素一一进行比较，如果对比完所有数据均没有则给出未找到提示
//如果找到则删除，从找到信息的下一个位置依次覆盖前一个信息直到数据结束，数据总个数减1
void delete_id(){
char id[20];  //记录要删除的商品编号，要与商品信息定义中编号的类型，长度一致
int flag = 0; //标志，记录商品编号是否查询到，0表示未查询到，1表示查询到
int i;
char choice;
int j;
printf("\n请输入要删除商品的编号:");
scanf("%s",id);
for(i = 0;i < count;i++){
if(strcmp(id,good[i].id) == 0){
printf("\n查询到要删除商品的相关商品信息如下:");
printf("%s %s %s %d %lf\n",good[i].id,good[i].name,good[i].where,good[i].num,good[i].price);
printf("确定要删除吗？（Y/N）:");
scanf(" %c",&choice);
if(choice == 'Y' || choice == 'y'){
for(j = i;j< count;j++){
strcpy(good[j].id,good[j+1].id);
strcpy(good[j].name,good[j+1].name);
strcpy(good[j].where,good[j+1].where);
good[j].num = good[j+1].num;
good[j].price = good[j+1].price;
}

count--;
printf("\n商品删除成功！\n");
output_good();
//printf("\n按任意键返回！\n");  因为在out_good函数中已有，不需要，否则重复
//getch();
flag = 1;
break;
}

}

}

if(flag == 0){
printf("\n未查询到要删除的相关商品信息！\n");
printf("\n按任意键返回！\n");
getch();
}

}

//文件写入函数：以商品信息为例，写入文件
//返回-1，表示文件打开失败， 0表示写入成功
int output_file(){
//第一步：打开文件
FILE *fp = fopen("good_data.bin","wb");
//第二步：判断文件是否成功
if(fp == NULL){
printf("文件good_data.bin打开失败! \n");
return -1;
}

//第三步：文件操作（写入：将商品结构体数组中的所有数据写入good_data.bin，一次只能写一个商品结构体数据，总写入count个商品信息）
fwrite(good,sizeof(struct goods),count,fp);
//第四步：关闭文件
fclose(fp);
return 0;
}

//商品文件信息读取函数：将good_data.bin中数据读取暂存在程序的数据类型中供程序使用。
//返回-1，表示文件打开失败，0表示写入成功
int intput_file(){
FILE *fp = fopen("good_data.bin","rb");
if(fp == NULL){
printf("文件good_data.bin打开失败! \n");
return -1;
}

//文件操作（读取：将good_data.bin中的数据依次读取出来，一次读一个商品结构体的数据
//存入商品结构体数组good对应数组元素位置count指示，每读一次count值加一，直到无数可读
while(    fread(&good[count],sizeof(struct goods),1,fp) >0 ){
//printf("%s %s %s %d %lf\n",good[count].id,good[count].name,good[count].where,good[count].num,good[count].price);
count++;
}

fclose(fp);
return 0;
}

//商品信息查询函数
// 分析：以商品编号为例， 在商品结构体数组good中依次对比有没有要找的商品编号
//如有，则显示该商品信息，如果整个商品结构体中都没有则说明没有找到该商品，则给出未查询到该商品等提示信息
//实现：利用循环将要查询的商品编号依次和结构体数组good中数组元素分项编号对比
//要查询的商品编号是否需要单独存储？  需要
//如何知道商品结构体good中已经找到该商品编号并结束查找？    设置一个标志，找到则修改该标志的值退出循环
void select_id(){
char id[20];  //记录要查询的商品编号，要与商品信息定义中编号的类型，长度一致
int flag = 0; //标志，记录商品编号是否查询到，0表示未查询到，1表示查询到
int i;
printf("\n请输入要查询的编号:");
scanf("%s",id);
for(i = 0;i < count;i++){
if(strcmp(id,good[i].id) == 0){
printf("\n查询到相关商品信息如下:");
printf("%s %s %s %d %lf\n",good[i].id,good[i].name,good[i].where,good[i].num,good[i].price);
flag = 1;
printf("\n按任意键返回！\n");
getch();
break;
}

}

if(flag == 0){
printf("\n未查询到相关商品信息！\n");
printf("\n按任意键返回！\n");
getch();
}

}

//商品信息修改函数
//分析：将要修改的信息中关键内容与待修改的信息一一比较
//如果整个信息比较完成，都没有找到则直接给出未找到的提示信息
//如果找到，则修改，将新的值一一替换旧的值
//实现：要修改的信息中关键内容 ，利用循环依次与商品结构体数组good中数组元素的的商品编号分项一一比较
//如果整个结构体数组good比较完成，都没有找到相同的则直接给出未找到要修改的商品信息提示信息
//如果找到，则修改，从键盘输入新的值一一替换旧的值
void modify_id(){
char id[20];  //记录要修改的商品编号，要与商品信息定义中编号的类型，长度一致
int flag = 0; //标志，记录商品编号是否查询到，0表示未查询到，1表示查询到
int i;
printf("\n请输入要修改商品的编号:");
scanf("%s",id);
for(i = 0;i < count;i++){
if(strcmp(id,good[i].id) == 0){
printf("\n查询到相关商品信息如下:");
printf("%s %s %s %d %lf\n",good[i].id,good[i].name,good[i].where,good[i].num,good[i].price);
printf("\n请输入要修改的商品信息内容！\n");
printf("\n当前实现商品的名称：");
scanf("%s",&good[i].name);
printf("\n当前实现商品的产地：");
scanf("%s",&good[i].where);
printf("\n当前实现商品的数量：");
scanf("%d",&good[i].num);
printf("\n当前实现商品的价格：");
scanf("%lf",&good[i].price);
printf("\n商品修改成功！\n");
printf("%s %s %s %d %lf",good[i].id,good[i].name,good[i].where,good[i].num,good[i].price);
flag = 1;
printf("\n按任意键返回！\n");
getch();
break;
}

}

if(flag == 0){
printf("\n未查询到要修改的相关商品信息！\n");
printf("\n按任意键返回！\n");
getch();
}

}

// 定义库存结构体
struct StockItem {
char id[20];       // 商品编号（主键）
char name[50];     // 商品名称
char category[30]; // 商品类别
int quantity;      // 当前库存量
int threshold;     // 库存阈值（低于此值触发预警）
double price;      // 单价
};
struct StockItem stock[100]; // 库存数组（最大100件商品）
int stock_ = 0;               // 当前商品数量
// 菜单函数
void work() {
printf("\n===== 库存管理系统 =====\n");
printf("1. 库存信息管理（查看/修改）\n");
printf("2. 入库管理\n");
printf("3. 出库管理\n");
printf("4. 库存盘点\n");
printf("5. 库存控制（设置阈值/预警）\n");
printf("0. 退出系统\n");
printf("请选择操作：");
}

// 查找商品（按编号）
int find_item(char *id) {
int i;  // 提前声明变量i
for (i = 0; i < count; i++) {
if (strcmp(stock[i].id, id) == 0) return i; // 找到返回下标
}

return -1; // 未找到返回-1
}

// 1. 库存信息管理（查看所有/修改信息）
void manage_stock_info() {
int choice;
printf("\n--- 库存信息管理 ---\n");
printf("1. 查看所有库存\n");
printf("2. 修改商品信息\n");
printf("0. 返回主菜单\n");
scanf("%d", &choice);
if (choice == 1) {
if (count == 0) {
printf("\n库存为空！\n");
return;
}

// 表格化展示库存
int i;//提前声明变量i
printf("\n编号\t名称\t类别\t库存\t阈值\t单价(元)\n");
for (i = 0; i < count; i++) {
printf("%-8s %-10s %-8s %-6d %-6d %.2f\n",
stock[i].id, stock[i].name, stock[i].category,
stock[i].quantity, stock[i].threshold, stock[i].price);
}

} else if (choice == 2) {
char id[20];
printf("\n请输入要修改的商品编号：");
scanf("%s", id);
int index = find_item(id);
if (index == -1) {
printf("\n商品不存在！\n");
return;
}

// 修改信息
printf("\n当前商品信息：\n");
printf("名称：%s\t类别：%s\t库存：%d\t阈值：%d\t单价：%.2f\n",
stock[index].name, stock[index].category,
stock[index].quantity, stock[index].threshold, stock[index].price);
printf("\n输入新名称（留空不修改）：");
scanf("%s", stock[index].name);
if (strlen(stock[index].name) == 0) strcpy(stock[index].name, "未命名");
printf("输入新类别（留空不修改）：");
scanf("%s", stock[index].category);
if (strlen(stock[index].category) == 0) strcpy(stock[index].category, "其他");
}

}

// 2. 入库管理
void manage_inventory() {
char choice;
while (1) {
if (count >= 100) {
printf("\n库存容量已满！\n");
break;
}

struct StockItem newItem;
printf("\n--- 商品入库 ---\n");
printf("输入商品编号：");
scanf("%s", newItem.id);
// 检查编号重复
if (find_item(newItem.id) != -1) {
printf("编号已存在！请重新输入\n");
return;
}

printf("输入商品名称：");
scanf("%s", newItem.name);
printf("输入类别：");
scanf("%s", newItem.category);
printf("输入入库数量：");
scanf("%d", &newItem.quantity);
printf("输入单价：");
scanf("%lf", &newItem.price);
newItem.threshold = 50; // 默认阈值设为50（可在库存控制中修改）
stock[count++] = newItem;
printf("\n入库成功！当前库存数量：%d\n", newItem.quantity);
// 询问是否继续
printf("继续入库？(Y/N)：");
scanf(" %c", &choice);
if (choice != 'Y' && choice != 'y') break;
}

}

// 3. 出库管理
void manage_outventory() {
char id[20];
int num;
printf("\n--- 商品出库 ---\n");
printf("输入商品编号：");
scanf("%s", id);
int index = find_item(id);
if (index == -1) {
printf("\n商品不存在！\n");
return;
}

printf("当前库存：%d 件\n", stock[index].quantity);
printf("输入出库数量：");
scanf("%d", &num);
if (num <= 0) {
printf("\n出库数量不能为负数！\n");
return;
}

if (num > stock[index].quantity) {
printf("\n库存不足！最多可出库 %d 件\n", stock[index].quantity);
return;
}

stock[index].quantity -= num;
printf("\n出库成功！剩余库存：%d 件\n", stock[index].quantity);
}

// void stock_check() {
void stock_check() {
int i;
if (count == 0) {
printf("\n库存为空！\n");
return;
}

double totalValue = 0;
for (i = 0;i < count; i++) {
totalValue += stock[i].quantity * stock[i].price;
}

printf("\n--- 库存盘点结果 ---\n");
printf("商品总数：%d 件\n", count);
printf("库存总价值：%.2f 元\n", totalValue);
// 触发库存预警
printf("\n--- 库存预警 ---\n");
for ( i = 0; i < count; i++) {
if (stock[i].quantity < stock[i].threshold) {
printf("警告：%s（编号：%s）库存仅剩 %d 件（低于阈值%d）！\n",
stock[i].name, stock[i].id, stock[i].quantity, stock[i].threshold);
}

}

}

// 5. 库存控制（设置阈值/查看预警）
void stock_control() {
int i;
int choice;
printf("\n--- 库存控制 ---\n");
printf("1. 设置库存阈值\n");
printf("2. 查看所有预警商品\n");
printf("0. 返回主菜单\n");
scanf("%d", &choice);
if (choice == 1) {
char id[20];
int threshold;
printf("\n输入商品编号：");
scanf("%s", id);
int index = find_item(id);
if (index == -1) {
printf("\n商品不存在！\n");
return;
}

printf("当前阈值：%d\n", stock[index].threshold);
printf("输入新阈值：");
scanf("%d", &threshold);
stock[index].threshold = threshold;
printf("\n阈值设置成功！\n");
} else if (choice == 2) {
printf("\n--- 库存预警商品 ---\n");
int hasWarn = 0;
for (i = 0; i < count; i++) {
if (stock[i].quantity < stock[i].threshold) {
printf("编号：%s\t名称：%s\t库存：%d\t阈值：%d\n",
stock[i].id, stock[i].name, stock[i].quantity, stock[i].threshold);
hasWarn = 1;
}

}

if (!hasWarn) printf("\n当前无库存预警！\n");
}

}

// 主函数
int main_stock() {
int choice;
do {
menu();
scanf("%d", &choice);
switch (choice) {
case 1:
manage_stock_info();
break;
case 2:
manage_inventory();
break;
case 3:
manage_outventory();
break;
case 4:
stock_check();
break;
case 5:
stock_control();
break;
case 0:
printf("退出库存管理系统！\n");
break;
default:
printf("无效选择！请重新输入\n");
}

} while (choice != 0);
return 0;
}

#include <stdio.h>
#include <string.h>
#include <time.h> // 用于生成销售日期
// 客户结构体
struct Customer {
char id[20];       // 客户编号
char name[50];     // 客户名称
char contact[20];  // 联系人
char phone[15];    // 联系电话
};
// 销售计划结构体
struct SalesPlan {
char planId[20];   // 计划编号
char product[50];  // 产品名称
int targetQty;     // 销售目标数量
double targetAmt;  // 销售目标金额
char startDate[11];// 开始日期（YYYY-MM-DD）
char endDate[11];  // 结束日期（YYYY-MM-DD）
};
// 销售渠道结构体
struct SalesChannel {
char channelId[20];// 渠道编号
char channelName[30]; // 渠道名称（如电商/线下/分销）
char manager[20];  // 渠道负责人
};
// 销售活动结构体
struct SalesActivity {
char activityId[20];// 活动编号
char activityName[50]; // 活动名称
char description[100]; // 活动描述
char date[11];       // 活动日期
};
// 销售业绩结构体
struct SalesPerformance {
char customerId[20];// 客户编号
char product[50];   // 产品名称
int soldQty;        // 销售数量
double salesAmt;    // 销售金额
char saleDate[11];  // 销售日期
};
// 数据存储数组（最大容量100）
struct Customer customers[100];
struct SalesPlan plans[100];
struct SalesChannel channels[100];
struct SalesActivity activities[100];
struct SalesPerformance performances[100];
int customerCount = 0, planCount = 0, channelCount = 0, activityCount = 0, perfCount = 0;
// 生成唯一编号（简化实现，实际可用UUID算法）
char* generateId(char prefix[]) {
static int seq = 1;
char id[20];
sprintf(id, "%s-%03d", prefix, seq++);
return strcpy((char*)malloc(strlen(id)+1), id);
}

// 客户管理模块
void customerManagement() {
int choice;
printf("\n--- 客户管理 ---\n");
printf("1. 新增客户\n");
printf("2. 查看所有客户\n");
printf("3. 修改客户信息\n");
printf("0. 返回上级\n");
scanf("%d", &choice);
if (choice == 1) {
if (customerCount >= 100) { printf("客户数量已满！"); return; }
struct Customer c;
char *generatedId = generateId("CUST");
strcpy(c.id, generatedId);
free(generatedId);
printf("输入客户名称："); scanf("%s", c.name);
printf("输入联系人："); scanf("%s", c.contact);
printf("输入联系电话："); scanf("%s", c.phone);
customers[customerCount++] = c;
printf("客户新增成功！编号：%s\n", c.id);
} else if (choice == 2) {
if (customerCount == 0) { printf("无客户信息！"); return; }
printf("\n客户列表：\n编号\t名称\t联系人\t电话\n");
int i;
for (i=0; i<customerCount; i++) {
printf("%s\t%s\t%s\t%s\n",
customers[i].id, customers[i].name,
customers[i].contact, customers[i].phone);
}

}

}

// 销售计划模块
void salesPlanManagement() {
int choice;
printf("\n--- 销售计划管理 ---\n");
printf("1. 制定新计划\n");
printf("2. 查看所有计划\n");
printf("0. 返回上级\n");
scanf("%d", &choice);
if (choice == 1) {
if (planCount >= 100) { printf("计划数量已满！"); return; }
struct SalesPlan p;
char temp_product[50];
scanf("%s", temp_product);
strcpy(p.product, temp_product);
printf("输入产品名称："); scanf("%s", p.product);
printf("输入销售目标数量："); scanf("%d", &p.targetQty);
printf("输入目标金额："); scanf("%lf", &p.targetAmt);
// 获取当前日期作为开始日期（简化处理）
time_t now = time(0);
struct tm *ltm = localtime(&now);
sprintf(p.startDate, "%d-%02d-%02d", 1900+ltm->tm_year, 1+ltm->tm_mon, ltm->tm_mday);
sprintf(p.endDate, "%d-%02d-%02d", 1900+ltm->tm_year+1, 1+ltm->tm_mon, ltm->tm_mday);
plans[planCount++] = p;
printf("计划制定成功！编号：%s\n", p.planId);
}

}

// 销售渠道管理模块
void channelManagement() {
int choice;
printf("\n--- 销售渠道管理 ---\n");
printf("1. 新增渠道\n");
printf("2. 查看渠道列表\n");
printf("0. 返回上级\n");
scanf("%d", &choice);
if (choice == 1) {
if (channelCount >= 100) { printf("渠道数量已满！"); return; }
struct SalesChannel ch;
char *generatedId = generateId("CHAN");
if (choice == 1) {
if (channelCount >= 100) { printf("渠道数量已满！"); return; }
struct SalesChannel ch;
char *generatedId = generateId("CHAN");
strcpy(ch.channelId, generatedId);
free(generatedId);
printf("输入渠道名称: "); scanf("%s", ch.channelName);
printf("输入渠道负责人: "); scanf("%s", ch.manager);
channels[channelCount++] = ch;
printf("渠道新增成功！编号: %s\n", ch.channelId);
}

strcpy(ch.channelId, generatedId);
free(generatedId);
printf("输入渠道名称："); scanf("%s", ch.channelName);
printf("输入渠道负责人："); scanf("%s", ch.manager);
channels[channelCount++] = ch;
printf("渠道新增成功！编号：%s\n", ch.channelId);
}

}

// 销售活动管理模块
void activityManagement() {
int choice;
printf("\n--- 销售活动管理 ---\n");
printf("1. 创建活动\n");
printf("2. 查看活动记录\n");
printf("0. 返回上级\n");
scanf("%d", &choice);
if (choice == 1) {
if (activityCount >= 100) { printf("活动数量已满！"); return; }
struct SalesActivity a;
char *generatedId = generateId("ACT");
strcpy(a.activityId, generatedId);
free(generatedId);
printf("输入活动名称："); scanf("%s", a.activityName);
printf("输入活动描述："); scanf("%s", a.description);
// 获取当前日期作为活动日期
time_t now = time(0);
struct tm *ltm = localtime(&now);
sprintf(a.date, "%d-%02d-%02d", 1900+ltm->tm_year, 1+ltm->tm_mon, ltm->tm_mday);
activities[activityCount++] = a;
printf("活动创建成功！编号：%s\n", a.activityId);
}

}

// 销售业绩评估模块
void performanceEvaluation() {
int choice;
printf("\n--- 销售业绩评估 ---\n");
printf("1. 录入销售数据\n");
printf("2. 查看业绩报表\n");
printf("0. 返回上级\n");
scanf("%d", &choice);
if (choice == 1) {
if (perfCount >= 100) { printf("业绩记录已满！"); return; }
struct SalesPerformance perf;
char *generatedId = generateId("DATE");
strcpy(perf.saleDate, generatedId);
free(generatedId);
printf("输入客户编号："); scanf("%s", perf.customerId);
printf("输入产品名称："); scanf("%s", perf.product);
printf("输入销售数量："); scanf("%d", &perf.soldQty);
printf("输入销售金额："); scanf("%lf", &perf.salesAmt);
performances[perfCount++] = perf;
printf("业绩数据录入成功！\n");
} else if (choice == 2) {
if (perfCount == 0) { printf("无业绩数据！"); return; }
double totalAmt = 0;
printf("\n销售业绩报表：\n客户\t产品\t数量\t金额\t日期\n");
int i;
for (i=0; i<perfCount; i++) {
printf("%s\t%s\t%d\t%.2f\t%s\n",
performances[i].customerId, performances[i].product,
performances[i].soldQty, performances[i].salesAmt,
performances[i].saleDate);
totalAmt += performances[i].salesAmt;
}

printf("\n总销售额：%.2f 元\n", totalAmt);
}

}

// 主菜单
void salesMainMenu() {
printf("\n===== 销售管理系统 =====\n");
printf("1. 客户管理\n");
printf("2. 销售计划制定\n");
printf("3. 销售渠道管理\n");
printf("4. 销售活动管理\n");
printf("5. 销售业绩评估\n");
printf("0. 退出系统\n");
printf("请选择操作：");
}

// 主函数
int sale() {
int choice;
do {
mainMenu();
scanf("%d", &choice);
switch (choice) {
case 1: customerManagement(); break;
case 2: salesPlanManagement(); break;
case 3: channelManagement(); break;
case 4: activityManagement(); break;
case 5: performanceEvaluation(); break;
case 0: printf("退出销售管理系统！\n"); break;
default: printf("无效选择！请重新输入\n");
}

} while (choice != 0);
return 0;
}

#include <stdio.h>
#include <string.h>
#include <time.h> // 用于生成日期
// 会员等级定义
typedef enum {
BRONZE = 1,    // 青铜会员（积分<1000）
SILVER,        // 白银会员（1000≤积分<3000）
GOLD,          // 黄金会员（3000≤积分<5000）
PLATINUM       // 铂金会员（积分≥5000）
} MemberLevel;
// 会员结构体
struct Member {
char id[20];          // 会员编号（自动生成）
char name[50];        // 姓名
char phone[15];       // 手机号（唯一标识）
int points;           // 累计积分
MemberLevel level;    // 会员等级
char regDate[11];     // 注册日期（YYYY-MM-DD）
};
// 会员消费记录结构体
struct Consumption {
char memberId[20];    // 会员编号
double amount;        // 消费金额
char date[11];        // 消费日期
};
// 数据存储数组（最大容量100）
struct Member members[100];
struct Consumption records[100];
int memberCount = 0, recordCount = 0;
// 生成唯一会员编号（格式：MEMBER-YYYYMMDD-序号）
char* generateMemberId() {
time_t now = time(0);
struct tm *ltm = localtime(&now);
static int seq = 1;
char id[20];
sprintf(id, "MEMBER-%04d%02d%02d-%03d",
1900+ltm->tm_year, 1+ltm->tm_mon, ltm->tm_mday, seq++);
return strcpy((char*)malloc(strlen(id)+1), id);
}

// 自动更新会员等级
void updateMemberLevel(struct Member *m) {
if (m->points >= 5000) {
m->level = PLATINUM;
} else if (m->points >= 3000) {
m->level = GOLD;
} else if (m->points >= 1000) {
m->level = SILVER;
} else {
m->level = BRONZE;
}

}

// 1. 会员信息管理模块
void memberInfoManagement() {
int choice;
printf("\n--- 会员信息管理 ---\n");
printf("1. 新增会员\n");
printf("2. 查看所有会员\n");
printf("3. 修改会员信息\n");
printf("0. 返回上级\n");
scanf("%d", &choice);
if (choice == 1) {
if (memberCount >= 100) { printf("会员数量已满！"); return; }
struct Member m;
if (choice == 1) {
if (memberCount >= 100) { printf("会员数量已满！"); return; }
struct Member n;
char *generatedId = generateMemberId();
int i;
for (i = 0; i < memberCount; i++) {
if (strcmp(members[i].phone, n.phone) == 0) {
printf("手机号已注册！");
return;
}

}

free(generatedId);
printf("输入姓名："); scanf("%s", m.name);
printf("输入手机号（唯一标识）："); scanf("%s", m.phone);
// 检查手机号重复
void memberInfoManagement() {
int choice;
int i; // 在这里统一声明i
if (choice == 1) {
for (i = 0; i < memberCount; i++) {
if (strcmp(members[i].phone, n.phone) == 0) {
printf("手机号已注册！");
return;
}

}

}

}

if (strcmp(members[i].phone, m.phone) == 0) {
printf("手机号已注册！");
return;
}

}

m.points = 0; // 新会员初始积分为0
time_t now = time(0);
struct tm *ltm = localtime(&now);
sprintf(m.regDate, "%d-%02d-%02d",
1900+ltm->tm_year, 1+ltm->tm_mon, ltm->tm_mday);
updateMemberLevel(&m); // 初始化等级
members[memberCount++] = m;
printf("会员新增成功！编号：%s\n", m.id);
}

}

// 2. 会员等级管理模块
void memberLevelManagement() {
int choice;
printf("\n--- 会员等级管理 ---\n");
printf("1. 查看各等级会员数量\n");
printf("2. 手动调整会员等级\n");
printf("0. 返回上级\n");
scanf("%d", &choice);
if (choice == 1) {
int bronze=0, silver=0, gold=0, platinum=0;
int i;
for (i=0; i<memberCount; i++) {
switch(members[i].level) {
case BRONZE: bronze++; break;
case SILVER: silver++; break;
case GOLD: gold++; break;
case PLATINUM: platinum++; break;
}

}

printf("\n会员等级分布：\n");
printf("青铜会员：%d人\n白银会员：%d人\n黄金会员：%d人\n铂金会员：%d人\n",
bronze, silver, gold, platinum);
}

}

// 3. 会员积分管理模块
void pointsManagement() {
int choice;
printf("\n--- 会员积分管理 ---\n");
printf("1. 消费积分录入（1元=1积分）\n");
printf("2. 查看会员积分明细\n");
printf("0. 返回上级\n");
scanf("%d", &choice);
if (choice == 1) {
char phone[15];
double amount;
printf("输入会员手机号："); scanf("%s", phone);
// 查找会员
struct Member *m = NULL;
int i;
for (i=0; i<memberCount; i++) {
if (strcmp(members[i].phone, phone) == 0) {
m = &members[i];
break;
}

}

if (!m) { printf("会员不存在！"); return; }
printf("输入消费金额："); scanf("%lf", &amount);
if (amount <= 0) { printf("金额无效！"); return; }
// 记录消费
struct Consumption rec;
strcpy(rec.memberId, m->id);
rec.amount = amount;
time_t now = time(0);
struct tm *ltm = localtime(&now);
sprintf(rec.date, "%d-%02d-%02d",
1900+ltm->tm_year, 1+ltm->tm_mon, ltm->tm_mday);
records[recordCount++] = rec;
// 更新积分
m->points += (int)amount; // 1元=1积分
updateMemberLevel(m); // 自动更新等级
printf("积分已到账！当前积分：%d，等级：%s\n",
m->points,
m->level == BRONZE ? "青铜" :
m->level == SILVER ? "白银" :
m->level == GOLD ? "黄金" : "铂金");
}

}

// 4. 会员销售与关怀模块
void memberCare() {
int choice;
printf("\n--- 会员销售与关怀 ---\n");
printf("1. 发送生日关怀短信\n");
printf("2. 高价值会员回访（积分≥3000）\n");
printf("0. 返回上级\n");
scanf("%d", &choice);
if (choice == 2) {
printf("\n高价值会员列表（积分≥3000）：\n");
int i;
for (i=0; i<memberCount; i++) {
if (members[i].points >= 3000) {
printf("姓名：%s\t手机号：%s\t积分：%d\n",
members[i].name, members[i].phone, members[i].points);
}

}

}

}

// 5. 会员数据分析模块
void dataAnalysis() {
printf("\n--- 会员数据分析 ---\n");
if (memberCount == 0) { printf("无会员数据！"); return; }
// 统计平均积分
int totalPoints = 0;
int i;
for (i=0; i<memberCount; i++) {
totalPoints += members[i].points;
}

double avgPoints = (double)totalPoints / memberCount;
// 查找消费最高记录
double maxAmount = 0;
struct Consumption *maxRec = NULL;
for (i=0; i<recordCount; i++) {
if (records[i].amount > maxAmount) {
maxAmount = records[i].amount;
maxRec = &records[i];
}

}

printf("\n会员总数：%d人\n", memberCount);
printf("平均积分：%.1f分\n", avgPoints);
if (maxRec) {
printf("最高消费记录：%s（%s，金额：%.2f元）\n",
maxRec->memberId, maxRec->date, maxRec->amount);
}

}

// 主菜单
void memberMainMenu() {
printf("\n===== 会员管理系统 =====\n");
printf("1. 会员信息管理\n");
printf("2. 会员等级管理\n");
printf("3. 会员积分管理\n");
printf("4. 会员销售与关怀\n");
printf("5. 会员数据分析\n");
printf("0. 退出系统\n");
printf("请选择操作：");
}

// 主函数
int funtion() {
int choice;
do {
mainMenu();
scanf("%d", &choice);
switch (choice) {
case 1: memberInfoManagement(); break;
case 2: memberLevelManagement(); break;
case 3: pointsManagement(); break;
case 4: memberCare(); break;
case 5: dataAnalysis(); break;
case 0: printf("退出会员管理系统！\n"); break;
default: printf("无效选择！请重新输入\n");
}

} while (choice != 0);
return 0;
}

#include <stdio.h>
#include <string.h>
#include <time.h> // 用于日期处理
// 员工职位等级
typedef enum {
JUNIOR = 1,    // 初级
MIDLEVEL,      // 中级
SENIOR,        // 高级
MANAGER        // 经理
} PositionLevel;
// 员工结构体
struct Employee {
char id[20];          // 员工编号（自动生成）
char name[50];        // 姓名
char department[30];  // 部门
PositionLevel level;  // 职位等级
char hireDate[11];    // 入职日期（YYYY-MM-DD）
double baseSalary;    // 基本工资
};
// 培训记录结构体
struct TrainingRecord {
char empId[20];       // 员工编号
char trainingName[50];// 培训名称
char date[11];        // 培训日期
};
// 绩效记录结构体
struct Performance {
char empId[20];       // 员工编号
int score;            // 绩效评分（0-100）
char period[10];      // 考核周期（如2023Q3）
};
// 数据存储数组（最大容量100）
struct Employee employees[100];
struct TrainingRecord TrainingRecords[100];
struct Performance Performances[100];
int empCount = 0, trainCount = 0, newperfCount = 0;
// 生成唯一员工编号（格式：EMP-YYYYMMDD-序号）
char* generateEmpId() {
time_t now = time(0);
struct tm *ltm = localtime(&now);
static int seq = 1;
char id[20];
sprintf(id, "EMP-%04d%02d%02d-%03d",
1900+ltm->tm_year, 1+ltm->tm_mon, ltm->tm_mday, seq++);
return strcpy((char*)malloc(strlen(id)+1), id);
}

// 1. 员工招聘与入职模块
void recruitmentAndOnboarding() {
int choice;
printf("\n--- 员工招聘与入职 ---\n");
printf("1. 办理入职手续\n");
printf("2. 查看所有员工\n");
printf("0. 返回上级\n");
scanf("%d", &choice);
if (choice == 1) {
if (empCount >= 100) { printf("员工数量已满！"); return; }
struct Employee emp;
char* tempId = generateEmpId();
strcpy(emp.id, tempId);
free(tempId);
printf("输入姓名："); scanf("%s", emp.name);
printf("输入部门："); scanf("%s", emp.department);
printf("选择职位等级（1=初级，2=中级，3=高级，4=经理）：");
scanf("%d", &emp.level);
time_t now = time(0);
struct tm *ltm = localtime(&now);
sprintf(emp.hireDate, "%d-%02d-%02d",
1900+ltm->tm_year, 1+ltm->tm_mon, ltm->tm_mday);
// 初始化基本工资（根据等级设定）
switch(emp.level) {
case JUNIOR: emp.baseSalary = 5000; break;
case MIDLEVEL: emp.baseSalary = 8000; break;
case SENIOR: emp.baseSalary = 12000; break;
case MANAGER: emp.baseSalary = 20000; break;
}

employees[empCount++] = emp;
printf("入职成功！员工编号：%s，基本工资：%.2f元\n", emp.id, emp.baseSalary);
}

}

// 2. 员工培训与发展模块
typedef struct {
char empId[20];
char period[20];
int score;
} Perf;
void trainingAndDevelopment() {
int choice;
printf("\n--- 员工培训与发展 ---\n");
printf("1. 记录培训记录\n");
printf("2. 查看员工培训历史\n");
printf("0. 返回上级\n");
scanf("%d", &choice);
if (choice == 1) {
char empId[20];
printf("输入员工编号: ");
scanf("%s", empId);
// 检查员工是否存在
int index = -1;
int i;
for (i = 0; i < empCount; i++) {
if (strcmp(employees[i].id, empId) == 0) {
index = i;
break;
}

}

if (index == -1) { printf("员工不存在!"); return; }
struct TrainingRecord tr;
strcpy(tr.empId, empId);
printf("输入培训名称: ");
scanf("%s", tr.trainingName);
time_t now = time(0);
struct tm *ltm = localtime(&now);
sprintf(tr.date, "%d-%02d-%02d", 1900 + ltm->tm_year, 1 + ltm->tm_mon, ltm->tm_mday);
// trainings数组声明已移到全局 // 在使用前声明数组
trainings[trainCount++] = tr;
printf("培训记录添加成功！\n");
}

}

// 3. 绩效管理模块
// 定义Performance结构体
#pragma once
// 结构体定义放在这里
// 重复的Perf结构体定义已移除
void performanceManagement() {
int choice;
printf("\n--- 绩效管理 ---\n");
printf("1. 录入绩效评分\n");
printf("2. 查看绩效排名\n");
printf("0. 返回上级\n");
scanf("%d", &choice);
if (choice == 1) {
char empId[20];
printf("输入员工编号: ");
scanf("%s", empId);
struct Performance perf;
strcpy(perf.empId, empId);
printf("输入考核周期(如2023Q3): ");
scanf("%s", perf.period);
printf("输入绩效评分(0 - 100): ");
scanf("%d", &perf.score);
// performances数组声明已移到全局
static int perfcnt = 0;
performances[perfcnt++] = perf;
printf("绩效评分录入成功!\n");
}

}

// 4. 薪酬与福利管理模块
struct PerformanceInfo {
char empId[20];
int score;
};
typedef struct PerformanceInfo PerfInfo;
void salaryAndBenefits() {
int choice;
printf("\n--- 薪酬与福利管理 ---\n");
printf("1. 查看员工薪资详情\n");
printf("2. 计算年度总薪酬(基本工资+绩效奖金)\n");
printf("0. 返回上级\n");
scanf("%d", &choice);
if (choice == 1) {
char empId[20];
printf("输入员工编号: ");
scanf("%s", empId);
int i;
for (i = 0; i < empCount; i++) {
if (strcmp(employees[i].id, empId) == 0) {
struct Employee *e = &employees[i];
printf("\n员工: %s (%s)\n", e->name, e->department);
printf("职位等级: %s\t基本工资: %.2f元/月\n",
e->level == JUNIOR? "初级" : e->level == MIDLEVEL? "中级" : "高级", e->baseSalary);
// performances数组声明已移到全局
int hasBonus = 0;
int j;
for (j = 0; j < perfCount; j++) {
if (strcmp(performances[j].empId, empId) == 0 && performances[j].score > 80) {
hasBonus = 1;
break;
}

}

printf("本月福利: %s绩效奖金\n", hasBonus? "含" : "不含");
return;
}

}

printf("员工不存在!\n");
}

}

// 主菜单
void employeeMainMenu() {
printf("\n===== 员工管理系统 =====\n");
printf("1. 员工招聘与入职\n");
printf("2. 员工培训与发展\n");
printf("3. 绩效管理\n");
printf("4. 薪酬与福利管理\n");
printf("0. 退出系统\n");
printf("请选择操作：");
}

// 主函数
int minmain() {
int choice;
do {
mainMenu();
scanf("%d", &choice);
switch (choice) {
case 1: recruitmentAndOnboarding(); break;
case 2: trainingAndDevelopment(); break;
case 3: performanceManagement(); break;
case 4: salaryAndBenefits(); break;
case 0: printf("退出员工管理系统！\n"); break;
default: printf("无效选择！请重新输入\n");
}

} while (choice != 0);
return 0;
}

